package com.guomei.service.curse;

import com.guomei.bean.curse.ByUserIdGetAllDTO;
import com.guomei.bean.curse.UserCourseLearn;
import com.guomei.bean.curse.vo.CourseLearnStatDto;
import com.guomei.utils.Result;

import java.util.List;

/**
 * 用户课程学习记录Service接口
 */
public interface UserCourseLearnService {

    /**
     * 根据ID查询
     * @param id 主键
     * @return 用户课程学习记录
     */
    UserCourseLearn getById(Long id);

    /**
     * 根据用户ID和视频ID查询
     * @param userId 用户ID
     * @param videoId 视频ID
     * @return 用户课程学习记录
     */
    UserCourseLearn getByUserAndVideo(Long userId, Long videoId);

    /**
     * 根据用户ID和课程ID查询列表
     * @param userId 用户ID
     * @param courseId 课程ID
     * @return 学习记录列表
     */
    List<UserCourseLearn> listByUserAndCourse(Long userId, Long courseId);

    /**
     * 保存学习记录(新增或更新)
     * @param userCourseLearn 学习记录
     * @return 是否成功
     */
    boolean save(UserCourseLearn userCourseLearn);

    /**
     * 更新学习进度
     * @param userId 用户ID
     * @param videoId 视频ID
     * @param progress 进度(秒)
     * @param duration 学习时长(秒)
     * @return 是否成功
     */
    boolean updateProgress(Long userId, Long videoId, Integer progress, Integer duration);

    /**
     * 根据ID删除
     * @param id 主键
     * @return 是否成功
     */
    boolean deleteById(Long id);

    /**
     * 根据条件查询用户学习记录
     * @param userCourseLearn 查询条件
     * @return 用户学习记录列表
     */
    Result<?> listByCondition(UserCourseLearn userCourseLearn);
    /**
     * 根据用户id查询全部学习记录信息
     * @param byUserIdGetAllDTO 查询条件
     * @return 用户学习记录列表
     */
    Result<?> byUserIdGetAll(ByUserIdGetAllDTO byUserIdGetAllDTO);

    /**
     * 根据用户ID获取用户学习的课程ID列表
     * @param userId 用户ID
     * @return 课程ID列表
     */
    List<Long> getCourseIdsByUserId(Long userId);

    /**
     * 根据课程IDs和用户id查询学习记录
     * @param courseIds 课程IDs
     * @param userId 用户id
     * @return 学习记录列表
     */
    Result<?> listByVideoIdsAndUserId(List<Long> videoIds, Long userId);

    Result<?> getVideoLearnStats(CourseLearnStatDto dto);

    /**
     * 检查用户对某个课程的学习进度是否达到80%
     * @param userId 用户ID
     * @param courseId 课程ID
     * @return 是否达到80%
     */
    boolean checkCourseProgress(Long userId, Long courseId);

    /**
     * 获取用户已完成80%学习进度的课程ID列表
     * @param userId 用户ID
     * @return 课程ID列表
     */
    List<Long> getQualifiedCourseIds(Long userId);
}
